<?php
	require_once(dirname(__FILE__)."/incluir.php");
	// Como vai precisar de um valor único de GuardaDados em todos os momentos que gerar um viale, ele será um singleton
	class GuardaDados
	{
		private static $instance = null;
		// Campos que tem em dados.php de qualquer entidade 
		public $tabela;
		public $classe;
		public $nome_entidade;
		public $sufixo;
		public $limit;
		public $range;
		public $offset_default;
		public $referencia;
		public $campos_valores_default;
		public $campos_paginas;
		public $campos_multiplos;
		public $mensagens_erro_campos;
		public $mensagens_erro_campos_not_empty;
		public $mensagem_sucesso_inserir;
		public $mensagem_erro_inserir;
		public $mensagem_sucesso_alterar;
		public $mensagem_erro_alterar;
		public $mensagem_sucesso_excluir;
		public $mensagem_erro_excluir;
		public $tipos_campos;
		public $valores_campos;
		public $tabelas_excluir;
		public $fields; // Um array com a lista dos campos que a entidade possui
		public $types; // Um array com os tipos dos campos que estão no banco de dados (exemplo: varchar, int, etc.)
		// Por enquanto esse array é gerado automaticamente pelo VialeGenerico, no futuro seria legal que o usuario pudesse personaliza-lo
		public $campos;
		
		private function __construct()
		{
		}
		
		public static function getInstance()
		{
			if(self::$instance == null) // ve se já contém uma instancia
			{
				// se não contém a instancia, procura na session
				$session = new Session();
				if(isset($session->guarda_dados_instancia)) // se está da session usa ela
				{
					self::$instance = $session->guarda_dados_instancia;
				}
				else // se não cria uma nova instancia
				{
					self::$instance = new GuardaDados();
				}
			}
			return self::$instance;
		}
		
		// Se existe o viale da entidade, recupera as informações do seu arquivo dados.php
		private function recupera_dados_entidade($tabela)
		{
			$path_to_dados = dirname(__FILE__)."/../$this->tabela/dados.php";
			require($path_to_dados);
			$this->limit = $limit;
			$this->range = $range;
			$this->offset_default = $offset_default;
			$this->referencia = $referencia;
			$this->campos_valores_default = $campos_valores_default;
			$this->campos_paginas = $campos_paginas;
			$this->campos_multiplos = $campos_multiplos;
			$this->tabelas_excluir = $tabelas_excluir;
		}
		
		// Pega do BD as informações para os atributos $fields e $types
		private function carrega_campos_BD($tabela)
		{
			$this->fields = array();
			$this->types = array();
			$sqlController = new MySQLController($tabela);
			$sqlController->load_fields($this->fields, $this->types);
		}
		
		// Para campos que tem validações especiais, também terão mensagens de erro especiais.
		private function get_mensagem_erro_default($nome, $tipo, $campo_compara = null)
		{
			// Checagem pelo nome
			if(stristr($nome, 'email') != false)
			{
				return 'O campo deve conter um email válido'; 
			}
			else if(stristr($nome, 'telefone') != false)
			{
				return 'O campo deve conter um telefone válido';
			}
			else if(stristr($nome, 'cpf') != false)
			{
				return 'O campo deve conter um cpf válido';
			}
			
			// Checagem pelo tipo
			
			else if(stristr($tipo, 'date') != false)
			{
				return 'O campo deve conter uma data válida';
			}
			else if((stristr($tipo, 'int') != false) || (stristr($tipo, 'double') != false) ||
					(stristr($tipo, 'float') != false) || (stristr($tipo, 'decimal') != false))
			{
				return 'O campo deve conter um número';
			}
			// Se for um campo de confirmação de dados
			if(stristr($nome, 'confirma') != false)
			{
				return "Os valores de $nome e de $campo_compara devem ser iguais";
			}
			
			return ""; // Qualquer coisa o campo não terá uma mensagem de erro específica
		}
		
		// Guarda a tabela e os valores que dependem dela
		public function set_tabela($tabela)
		{
			$this->tabela = $tabela;
						
			// Se já existia o viale(e portanto o arquivo dados.php) chama essa função
			if(file_exists(dirname(__FILE__)."/../$this->tabela/dados.php"))
			{
				 $this->recupera_dados_entidade($tabela);
			}
			
			$this->carrega_campos_BD($tabela); // Carrega do BD os valores de $fields e de $types
			
			// Coloca os valores default
			$this->classe = ucfirst($tabela); 
			$this->nome_entidade = ucfirst($tabela);
			$this->sufixo = '_'.$tabela;
			$this->referencia = (in_array("nome", $this->fields)) ? "nome" : "";
			$this->mensagem_sucesso_inserir = $this->nome_entidade . ' inserido com sucesso';
			$this->mensagem_erro_inserir = "Falha ao inserir a linha atual";
			$this->mensagem_sucesso_alterar = $this->nome_entidade . ' alterado com sucesso';
			$this->mensagem_erro_alterar = "Falha ao alterar a linha atual";
			$this->mensagem_sucesso_excluir = $this->nome_entidade . ' excluido com sucesso';
			$this->mensagem_erro_excluir = "Falha ao excluir a linha atual";
			// Gera os valores default para as mensagens de erro de cada campo
			$this->mensagens_erro_campos = array();
			$this->mensagens_erro_campos_not_empty = array();
			foreach($this->types as $field => $type)
			{
				// Gera a mensagem de erro do campo com o nome $field e o tipo no banco $type
				$mensagem_erro = $this->get_mensagem_erro_default($field, $type);
				$mensagem_erro_not_empty = "O campo $field não pode estar vazio";
				// Coloca no final desses arrays
				array_push($this->mensagens_erro_campos, $mensagem_erro);
				array_push($this->mensagens_erro_campos_not_empty, $mensagem_erro_not_empty);
			}
		}
		
		// Quando o objeto é deletado, eu salvo ele na session para os seus dados permanescerem
		public function __destruct()
		{
			$session = new Session();
			$session->guarda_dados_instancia = self::$instance;
		}
	}
?>